package com.le.tester.book.effectivejava3.focus7;

import java.util.Arrays;
import java.util.EmptyStackException;

/**
 * createTime：2025-06-13 14:00
 * description：memory leak
 */
public class LStack {
    private Object[] elements;

    private int size;

    private static final int DEFAULT_INITIAL_CAPACITY = 16;

    public LStack() {
        elements = new Object[DEFAULT_INITIAL_CAPACITY];
    }

    public void push(Object e) {
        ensureCapacity();
        elements[size++] = e;
    }

    public Object pop() {
//        那么在栈的元素不断的被取出之后，想要它被回收，那么只要被标记成null，G1
        if (size == 0) {
            throw new EmptyStackException();
        }
        Object element = elements[--size];
//        特殊情况，特殊处理
        elements[size] = null;
        return element;
    }

    private void ensureCapacity() {
//        整个栈的长度在size不确定的情况下就会增长或者收缩
//        case:那么在栈增长了之后，随着元素不断的取出，栈会进行收缩
//        那么这个时候，这些个元素不会被垃圾回收器回收，就会到这内存一直被撑大，直到内存泄露
        if (elements.length == size) {
            elements = Arrays.copyOf(elements, 2 * size + 1);
        }
    }
}
